<

CupertinoTabBar には Localization の親が必要です

まとめ

のインスタンスCupertinoTabBarを持っている必要がありますLocalizationsローカライズされたものを提供するための親Semanticsヒント。をインスタンス化しようとしていますCupertinoTabBarローカリゼーションなし 結果は次のようなアサーションになります。

CupertinoTabBar requires a Localizations parent in order to provide an appropriate Semantics hint
for tab indexing. A CupertinoApp provides the DefaultCupertinoLocalizations, or you can
instantiate your own Localizations.
'package:flutter/src/cupertino/bottom_tab_bar.dart':
Failed assertion: line 213 pos 7: 'localizations != null'

コンテクスト

ローカライズされたセマンティクス情報をサポートするには、 のCupertinoTabBarローカライズが必要です。

この変更が行われる前は、Semanticsヒントが提供されました にCupertinoTabBarハードコーディングされた文字列でした。 「タブ、$total の $index」。セマンティクスの内容 ヒントもこのオリジナルから更新されました 英語の「Tab $index of $total」への文字列。

もしあなたのCupertinoTabBar範囲内です のCupertinoAppDefaultCupertinoLocalizationsすでにインスタンス化されており、あなたのニーズに適しているかもしれません 既存のコードを変更することなく、必要な情報を得ることができます。

もしあなたのCupertinoTabBar以内ではありませんCupertinoApp、 のローカライズを提供できます を使用して選択しますLocalizationsウィジェット。

移行ガイド

表示されている場合は、'localizations != null'アサーションエラー、 ロケール情報が存在することを確認してください あなたに提供されるCupertinoTabBar

移行前のコード:

import 'package:flutter/cupertino.dart';

void main() => runApp(Foo());

class Foo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MediaQuery(
      data: const MediaQueryData(),
      child: CupertinoTabBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(CupertinoIcons.add_circled),
            label: 'Tab 1',
          ),
          BottomNavigationBarItem(
            icon: Icon(CupertinoIcons.add_circled_solid),
            label: 'Tab 2',
          ),
        ],
        currentIndex: 1,
      ),
    );
  }
}

移行後のコード (CupertinoApp):

import 'package:flutter/cupertino.dart';

void main() => runApp(Foo());

class Foo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoApp(
      home: CupertinoTabBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(CupertinoIcons.add_circled),
            label: 'Tab 1',
          ),
          BottomNavigationBarItem(
            icon: Icon(CupertinoIcons.add_circled_solid),
            label: 'Tab 2',
          ),
        ],
        currentIndex: 1,
      ),
    );
  }
}

移行後のコード (次を使用してローカリゼーションを提供する) のLocalizationsウィジェット):

import 'package:flutter/cupertino.dart';

void main() => runApp(Foo());

class Foo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Localizations(
      locale: const Locale('en', 'US'),
      delegates: <LocalizationsDelegate<dynamic>>[
        DefaultWidgetsLocalizations.delegate,
        DefaultCupertinoLocalizations.delegate,
      ],
      child: MediaQuery(
        data: const MediaQueryData(),
        child: CupertinoTabBar(
          items: const <BottomNavigationBarItem>[
            BottomNavigationBarItem(
              icon: Icon(CupertinoIcons.add_circled),
              label: 'Tab 1',
            ),
            BottomNavigationBarItem(
              icon: Icon(CupertinoIcons.add_circled_solid),
              label: 'Tab 2',
            ),
          ],
          currentIndex: 1,
        ),
      ),
    );
  }
}

タイムライン

リリースされたバージョン: 1.18.0-9.0.pre
安定版リリース: 1.20.0

参考文献

API ドキュメント:

関連する PR:

  • PR 55336: CupertinoLocalizations への tabSemanticsLabel の追加
  • PR 56582:クパチーノのタブ セマンティクスをマテリアルと同じになるように更新する